package com.buobao.spring.ioc.service;

import com.buobao.spring.ioc.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    //这个注解也可以写在setter方法上，如果写在setter方法上会自动按类型/名称对set方法参数进行注入
    //如果放在属性上是不会执行setter方法的，那么将userDao变成一个public属性对其赋值，然后再改回private属性，这里其实是通过反射实现赋值的流程
    //这个注解是按类型注入的，如果注入的类型是一个接口A，这个接口有两个实现类AC1,AC2,并且这两个类都使用@Repository进行注解，此时在这里注入A就会报错。
    //解决的方案是将AC1和AC2中的一个@Repository注解去除（一般去除不使用的那个）
    //另一个解决方案是在AC1或者AC2中添加注解@Primary，指定冲突是优先使用哪个类也可以解决查看Employee的示例
    //如果要完全避免这个问题，需要使用按名称注入，department的示例
    @Autowired
    private UserDao userDao;

    public UserService() {
        System.out.println("创建UserService对象"+this);
    }

    public UserDao getUserDao() {
        System.out.println(userDao);
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        System.out.println("装配UserDao到UserService"+this);
        this.userDao = userDao;
    }
}
